import org.junit.jupiter.api.Test;

import java.util.Arrays;

public class _25_K个一组翻转链表 {
    @Test
    public void test(){
        System.out.println(10/2);

    }

    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode listNode=new ListNode(0);
        listNode.next=head;
        //用来存放结果
        ListNode res=listNode;
        //用来记录每次反转后下一个节点的位置
        ListNode after=null;
        ListNode cur=head;
        int length = getLength(head);
        if (head==null||length<k){
            return head;
        }
        int turnNum=length/k;


        for (int i = 0; i < turnNum; i++) {
            //用来记录每次反转的结果
            ListNode pre=null;
            //使用next记录当前节点的下一个节点
            ListNode next=null;
            //记录当前的是第几个节点
            int nodeDesc=k;
            //使用迭代法将局部进行反转
            while (nodeDesc!=0){
                //使用next记录当前节点的下一个节点
                next=cur.next;
                //将当前节点指向前一节点
                cur.next=pre;
                //将前一个节点往前面移动
                pre=cur;
                //将当前节点往前移动
                cur=next;
                after=cur;
                nodeDesc--;
            }
            res.next=pre;
            while (pre.next!=null){
                pre=pre.next;
            }
            pre.next=after;
            res=pre;
            cur=res.next;
        }
        //要是此时遍历完后还存有节点，就直接加载pre后面，因为此时的节点数量少于k
        return listNode.next;

    }

    public int getLength(ListNode head){
        int sum=0;
        while (head!=null){
            sum++;
            head=head.next;

        }
        return sum;
    }
}
